using System;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;
using Boyum.Utilities.FileHandler.Model;
using SAPbobsCOM;
using SBO.DI;

namespace UFFITemplate
{
    public class UffiRunner : UniversalFunctions.Public.FileImporter.IImporter
    {
        public FileHandlerResultEntry Import(FileHandlerParameters parameters)
        {
            try
            {
                var objectToImportFromXml = CreateObjectToImportFromXml(parameters);
                var document = B1BusinessObjects.Documents.Inventory.InventoryGenEntry.TemplateObject;
                document.DocObjectCode = BoObjectTypes.oInventoryGenEntry;
                document.DocDate = objectToImportFromXml.DocDate;
                var documentLines = document.Lines;
                bool first = true;
                foreach (var line in objectToImportFromXml.Lines)
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        documentLines.Add();
                    }
                    documentLines.ItemCode = line.ItemCode;
                    documentLines.Quantity = line.Quantity;
                    documentLines.SerialNumbers.InternalSerialNumber = line.SerialNumber;
                    documentLines.SerialNumbers.ManufacturerSerialNumber = line.SerialNumber;
                    documentLines.SerialNumbers.ReceptionDate = objectToImportFromXml.DocDate;
                }
                if (document.Add() != 0)
                {
                    return new FileHandlerResultEntry(FileHandlerResultStatus.Error, GetLastError.ErrorNumberAndDescription);
                }
                return new FileHandlerResultEntry(FileHandlerResultStatus.Success);
            }
            catch (Exception e)
            {
                return new FileHandlerResultEntry(FileHandlerResultStatus.Error, "Exception caught", e);
            }
        }

        private ObjectToImport CreateObjectToImportFromXml(FileHandlerParameters parameters)
        {
            var xmlDoc = new XmlDocument();
            xmlDoc.Load(parameters.File);
            var order = new ObjectToImport();
            order.DocDate = DateTime.Today;
            XmlNodeList items = xmlDoc.GetElementsByTagName("Item");
            foreach (XmlNode item in items)
            {
                var lines = new Line();
                foreach (XmlNode attributes in item.ChildNodes)
                {
                    switch (attributes.Name)
                    {
                        case "ItemCode":
                            lines.ItemCode = attributes.InnerText;
                            break;
                        case "Quantity":
                            lines.Quantity = Convert.ToInt32(attributes.InnerText);
                            break;
                        case "SerialNumber":
                            lines.SerialNumber = attributes.InnerText;
                            break;
                    }
                }
                order.Lines.Add(lines);
            }
            return order;
        }

        private class ObjectToImport
        {
            public DateTime DocDate { get; set; }
            public List<Line> Lines { get; private set; }
            public ObjectToImport()
            {
                Lines = new List<Line>();
            }
        }

        private class Line
        {
            public string ItemCode { get; set; }
            public double Quantity { get; set; }
            public string SerialNumber { get; set; }
        }
    }
}
